#!/usr/bin/env python3
"""
数据库初始化脚本
用于创建数据库表和初始数据
"""

from app import app
from extensions import db
from models import User, Category, Tag, Post, Comment, Setting
from werkzeug.security import generate_password_hash
from datetime import datetime

def init_database():
    """初始化数据库"""
    with app.app_context():
        # 创建所有表
        db.create_all()
        print("数据库表创建完成")
        
        # 检查是否已有数据
        if User.query.first():
            print("数据库已有数据，跳过初始化")
            return
        
        # 创建管理员用户
        admin_user = User(
            username='admin',
            email='admin@example.com',
            name='管理员',
            role='admin',
            bio='系统管理员',
            is_active=True
        )
        admin_user.set_password('admin123')
        db.session.add(admin_user)
        
        # 创建示例分类
        categories = [
            Category(name='技术', slug='tech', description='技术相关文章', color='#007bff'),
            Category(name='生活', slug='life', description='生活感悟', color='#28a745'),
            Category(name='学习', slug='study', description='学习笔记', color='#ffc107'),
            Category(name='随笔', slug='essay', description='随想随记', color='#6c757d')
        ]
        
        for category in categories:
            db.session.add(category)
        
        # 创建示例标签
        tags = [
            Tag(name='Python', slug='python', description='Python编程', color='#3776ab'),
            Tag(name='Flask', slug='flask', description='Flask框架', color='#000000'),
            Tag(name='Web开发', slug='web-dev', description='Web开发技术', color='#f7df1e'),
            Tag(name='数据库', slug='database', description='数据库相关', color='#336791'),
            Tag(name='前端', slug='frontend', description='前端技术', color='#61dafb'),
            Tag(name='后端', slug='backend', description='后端开发', color='#000000'),
            Tag(name='JavaScript', slug='javascript', description='JavaScript编程', color='#f7df1e'),
            Tag(name='Vue.js', slug='vuejs', description='Vue.js框架', color='#4fc08d'),
            Tag(name='React', slug='react', description='React框架', color='#61dafb'),
            Tag(name='Node.js', slug='nodejs', description='Node.js开发', color='#339933'),
            Tag(name='Docker', slug='docker', description='Docker容器', color='#2496ed'),
            Tag(name='MySQL', slug='mysql', description='MySQL数据库', color='#4479a1'),
            Tag(name='Redis', slug='redis', description='Redis缓存', color='#dc382d'),
            Tag(name='Linux', slug='linux', description='Linux系统', color='#fcc624'),
            Tag(name='Git', slug='git', description='Git版本控制', color='#f05032'),
            Tag(name='算法', slug='algorithm', description='算法与数据结构', color='#ff6b6b'),
            Tag(name='机器学习', slug='machine-learning', description='机器学习', color='#4ecdc4'),
            Tag(name='人工智能', slug='ai', description='人工智能', color='#45b7d1'),
            Tag(name='生活感悟', slug='life', description='生活感悟', color='#96ceb4'),
            Tag(name='读书笔记', slug='reading', description='读书笔记', color='#feca57')
        ]
        
        for tag in tags:
            db.session.add(tag)
        
        db.session.flush()  # 获取ID
        
        # 创建示例文章
        sample_posts = [
            {
                'title': '欢迎来到我的个人博客',
                'slug': 'welcome-to-my-blog',
                'content': '''
# 欢迎来到我的个人博客

这是我的第一篇博客文章，欢迎大家的到来！

## 关于这个博客

这个博客系统是基于 Flask 框架开发的，具有以下特性：

- 📝 文章管理
- 🏷️ 分类和标签
- 💬 评论系统
- 👤 用户管理
- 📊 统计分析

## 技术栈

- **后端**: Flask + SQLAlchemy
- **前端**: HTML + CSS + JavaScript
- **数据库**: SQLite

希望这个博客能够记录我的学习和成长历程，也欢迎大家与我交流！
                ''',
                'excerpt': '这是我的第一篇博客文章，欢迎大家的到来！',
                'layout_mode': 'no-image',
                'category_id': categories[0].id,
                'author_id': admin_user.id,
                'status': 'published',
                'is_featured': True,
                'published_at': datetime.utcnow()
            },
            {
                'title': 'Flask 开发经验分享',
                'slug': 'flask-development-experience',
                'content': '''
# Flask 开发经验分享

在开发这个博客系统的过程中，我积累了一些 Flask 开发的经验，今天来分享一下。

## 项目结构

Flask 项目的最佳实践是使用蓝图（Blueprint）来组织代码：

```
app/
├── __init__.py
├── models.py
├── routes/
│   ├── __init__.py
│   ├── main.py
│   ├── auth.py
│   └── api/
└── templates/
```

## 数据库设计

使用 SQLAlchemy ORM 可以让我们更方便地操作数据库：

```python
class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200), nullable=False)
    content = db.Column(db.Text, nullable=False)
    # ...
```

## 总结

Flask 是一个轻量级但功能强大的 Web 框架，非常适合快速开发原型和小型项目。
                ''',
                'excerpt': '在开发这个博客系统的过程中，我积累了一些 Flask 开发的经验，今天来分享一下。',
                'layout_mode': 'single-image',
                'cover_image': 'https://picsum.photos/800/400?random=1',
                'category_id': categories[0].id,
                'author_id': admin_user.id,
                'status': 'published',
                'is_featured': False,
                'published_at': datetime.utcnow()
            },
            {
                'title': 'Python 编程技巧大全',
                'slug': 'python-programming-tips',
                'content': '''
# Python 编程技巧大全

Python 是一门优雅而强大的编程语言，今天分享一些实用的编程技巧。

## 列表推导式

列表推导式是 Python 的一大特色，可以让代码更简洁：

```python
# 传统方式
squares = []
for x in range(10):
    squares.append(x**2)

# 列表推导式
squares = [x**2 for x in range(10)]
```

## 字典操作

字典是 Python 中非常重要的数据结构：

```python
# 合并字典
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}
merged = {**dict1, **dict2}
```

## 装饰器

装饰器是 Python 的高级特性：

```python
def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__} 执行时间: {end - start} 秒")
        return result
    return wrapper
```

## 总结

掌握这些技巧可以让你的 Python 代码更加优雅和高效！
                ''',
                'excerpt': 'Python 是一门优雅而强大的编程语言，今天分享一些实用的编程技巧。',
                'layout_mode': 'three-image',
                'cover_image': 'https://picsum.photos/800/400?random=2',
                'category_id': categories[1].id,
                'author_id': admin_user.id,
                'status': 'published',
                'is_featured': True,
                'published_at': datetime.utcnow()
            },
            {
                'title': 'Vue.js 3.0 新特性详解',
                'slug': 'vuejs-3-features',
                'content': '''
# Vue.js 3.0 新特性详解

Vue.js 3.0 带来了许多令人兴奋的新特性，让我们一起来看看。

## Composition API

Composition API 是 Vue 3 最重要的新特性之一：

```javascript
import { ref, reactive, computed } from 'vue'

export default {
  setup() {
    const count = ref(0)
    const state = reactive({ name: 'Vue 3' })
    
    const doubleCount = computed(() => count.value * 2)
    
    return { count, state, doubleCount }
  }
}
```

## 性能提升

Vue 3 在性能方面有显著提升：

- **更小的包体积**: 相比 Vue 2 减少了约 41%
- **更快的渲染**: 虚拟 DOM 重写，性能提升 2-3 倍
- **更好的 Tree-shaking**: 支持更好的代码分割

## Teleport

Teleport 允许我们将组件渲染到 DOM 树的其他位置：

```vue
<template>
  <div>
    <teleport to="body">
      <div class="modal">模态框内容</div>
    </teleport>
  </div>
</template>
```

## 总结

Vue 3 的这些新特性让开发体验更加优秀，性能也更加出色。
                ''',
                'excerpt': 'Vue.js 3.0 带来了许多令人兴奋的新特性，包括 Composition API、性能提升等。',
                'layout_mode': 'single-image',
                'cover_image': 'https://picsum.photos/800/400?random=3',
                'category_id': categories[0].id,
                'author_id': admin_user.id,
                'status': 'published',
                'is_featured': False,
                'published_at': datetime.utcnow()
            },
            {
                'title': 'Docker 容器化部署实践',
                'slug': 'docker-deployment-practice',
                'content': '''
# Docker 容器化部署实践

Docker 已经成为现代应用部署的标准，今天分享一些实践经验。

## Dockerfile 最佳实践

编写高效的 Dockerfile：

```dockerfile
# 使用多阶段构建
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

FROM node:16-alpine AS runtime
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
```

## Docker Compose

使用 Docker Compose 管理多容器应用：

```yaml
version: '3.8'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
    depends_on:
      - db
  
  db:
    image: postgres:13
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:
```

## 容器编排

在生产环境中，通常使用 Kubernetes 进行容器编排：

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
      - name: web-app
        image: myapp:latest
        ports:
        - containerPort: 3000
```

## 总结

Docker 让应用部署变得更加简单和一致，是现代开发必备技能。
                ''',
                'excerpt': 'Docker 已经成为现代应用部署的标准，分享一些容器化部署的实践经验。',
                'layout_mode': 'three-image',
                'cover_image': 'https://picsum.photos/800/400?random=4',
                'category_id': categories[0].id,
                'author_id': admin_user.id,
                'status': 'published',
                'is_featured': True,
                'published_at': datetime.utcnow()
            },
            {
                'title': 'JavaScript 异步编程深度解析',
                'slug': 'javascript-async-programming',
                'content': '''
# JavaScript 异步编程深度解析

JavaScript 的异步编程是前端开发的核心概念，让我们深入了解一下。

## Promise 基础

Promise 是处理异步操作的标准方式：

```javascript
const fetchData = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('数据获取成功')
    }, 1000)
  })
}

fetchData()
  .then(data => console.log(data))
  .catch(error => console.error(error))
```

## async/await

async/await 让异步代码看起来像同步代码：

```javascript
async function getData() {
  try {
    const response = await fetch('/api/data')
    const data = await response.json()
    return data
  } catch (error) {
    console.error('获取数据失败:', error)
  }
}
```

## 并发处理

处理多个异步操作：

```javascript
// 并行执行
const [user, posts, comments] = await Promise.all([
  fetchUser(userId),
  fetchPosts(userId),
  fetchComments(userId)
])

// 串行执行
for (const id of userIds) {
  const user = await fetchUser(id)
  console.log(user)
}
```

## 错误处理

完善的错误处理机制：

```javascript
async function robustFetch(url) {
  try {
    const response = await fetch(url)
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`)
    }
    return await response.json()
  } catch (error) {
    console.error('请求失败:', error)
    return null
  }
}
```

## 总结

掌握异步编程是 JavaScript 开发的基础，Promise 和 async/await 让代码更加优雅。
                ''',
                'excerpt': 'JavaScript 的异步编程是前端开发的核心概念，深入解析 Promise 和 async/await。',
                'layout_mode': 'single-image',
                'cover_image': 'https://picsum.photos/800/400?random=5',
                'category_id': categories[0].id,
                'author_id': admin_user.id,
                'status': 'published',
                'is_featured': False,
                'published_at': datetime.utcnow()
            },
            {
                'title': '机器学习入门指南',
                'slug': 'machine-learning-guide',
                'content': '''
# 机器学习入门指南

机器学习是人工智能的重要分支，今天分享一些入门知识。

## 什么是机器学习

机器学习是让计算机通过数据学习规律，从而做出预测或决策的技术。

## 主要类型

### 监督学习
- **分类**: 预测离散值（如邮件是否为垃圾邮件）
- **回归**: 预测连续值（如房价预测）

### 无监督学习
- **聚类**: 发现数据中的隐藏模式
- **降维**: 减少数据维度，保留重要信息

### 强化学习
- 通过与环境交互学习最优策略

## 常用算法

### 线性回归
```python
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

# 准备数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# 训练模型
model = LinearRegression()
model.fit(X_train, y_train)

# 预测
predictions = model.predict(X_test)
```

### 决策树
```python
from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier()
model.fit(X_train, y_train)
predictions = model.predict(X_test)
```

## 评估指标

- **准确率**: 正确预测的比例
- **精确率**: 预测为正例中实际为正例的比例
- **召回率**: 实际为正例中被正确预测的比例
- **F1分数**: 精确率和召回率的调和平均

## 总结

机器学习是一个广阔的领域，需要不断学习和实践才能掌握。
                ''',
                'excerpt': '机器学习是人工智能的重要分支，分享一些入门知识和常用算法。',
                'layout_mode': 'three-image',
                'cover_image': 'https://picsum.photos/800/400?random=6',
                'category_id': categories[2].id,
                'author_id': admin_user.id,
                'status': 'published',
                'is_featured': True,
                'published_at': datetime.utcnow()
            },
            {
                'title': '读书笔记：《代码整洁之道》',
                'slug': 'clean-code-book-notes',
                'content': '''
# 读书笔记：《代码整洁之道》

《代码整洁之道》是 Robert C. Martin 的经典著作，对编程实践有重要指导意义。

## 核心观点

### 有意义的命名
- 使用有意义的名称
- 避免误导性的名称
- 做有意义的区分
- 使用可搜索的名称

### 函数
- 函数应该短小
- 只做一件事
- 使用描述性的名称
- 函数参数应该尽可能少

### 注释
- 好的代码不需要注释
- 注释不能美化糟糕的代码
- 用代码来阐述意图

## 代码示例

### 糟糕的代码
```javascript
function calc(a, b, c) {
  return a * b + c;
}
```

### 改进后的代码
```javascript
function calculateTotalPrice(price, quantity, tax) {
  return price * quantity + tax;
}
```

## 实践建议

1. **重构**: 持续重构代码，保持代码整洁
2. **测试**: 编写测试用例，确保代码质量
3. **代码审查**: 通过代码审查发现潜在问题
4. **持续学习**: 不断学习新的编程技巧和最佳实践

## 总结

编写整洁的代码需要持续的努力和实践，但这会让我们的工作更加高效和愉快。
                ''',
                'excerpt': '《代码整洁之道》是编程实践的经典指南，分享一些读书心得和实践建议。',
                'layout_mode': 'no-image',
                'category_id': categories[2].id,
                'author_id': admin_user.id,
                'status': 'published',
                'is_featured': False,
                'published_at': datetime.utcnow()
            },
            {
                'title': '生活感悟：保持学习的热情',
                'slug': 'life-reflection-learning-passion',
                'content': '''
# 生活感悟：保持学习的热情

在这个快速变化的时代，保持学习的热情比任何时候都重要。

## 为什么要持续学习

### 技术更新快
- 编程语言和框架不断更新
- 新的工具和方法层出不穷
- 不学习就会被淘汰

### 个人成长
- 学习新技能提升竞争力
- 开阔视野，增长见识
- 保持思维活跃

## 如何保持学习热情

### 设定目标
- 制定明确的学习目标
- 分解为可执行的小步骤
- 定期回顾和调整

### 选择合适的方式
- 阅读技术书籍和文章
- 观看在线课程和视频
- 参与开源项目
- 与他人交流讨论

### 实践应用
- 将学到的知识应用到实际项目中
- 解决实际问题
- 总结经验教训

## 学习资源推荐

### 在线平台
- **Coursera**: 高质量的在线课程
- **edX**: 大学级别的课程
- **Udemy**: 实用的技能课程
- **YouTube**: 免费的学习视频

### 技术社区
- **GitHub**: 开源项目和学习资源
- **Stack Overflow**: 技术问答
- **Reddit**: 技术讨论社区
- **知乎**: 中文技术社区

## 总结

学习是一个终身的过程，保持学习的热情，让我们的生活更加充实和有意义。
                ''',
                'excerpt': '在这个快速变化的时代，保持学习的热情比任何时候都重要，分享一些学习心得。',
                'layout_mode': 'single-image',
                'cover_image': 'https://picsum.photos/800/400?random=7',
                'category_id': categories[1].id,
                'author_id': admin_user.id,
                'status': 'published',
                'is_featured': False,
                'published_at': datetime.utcnow()
            },
            {
                'title': 'Git 版本控制最佳实践',
                'slug': 'git-best-practices',
                'content': '''
# Git 版本控制最佳实践

Git 是现代软件开发中不可或缺的工具，掌握最佳实践很重要。

## 分支策略

### Git Flow
```
master (生产环境)
├── develop (开发环境)
├── feature/功能分支
├── release/发布分支
└── hotfix/紧急修复分支
```

### GitHub Flow
```
main (主分支)
└── feature/功能分支
```

## 提交信息规范

### 格式
```
<type>(<scope>): <subject>

<body>

<footer>
```

### 类型
- **feat**: 新功能
- **fix**: 修复bug
- **docs**: 文档更新
- **style**: 代码格式调整
- **refactor**: 代码重构
- **test**: 测试相关
- **chore**: 构建过程或辅助工具的变动

### 示例
```
feat(auth): add user login functionality

- Add login form validation
- Implement JWT token generation
- Add password encryption

Closes #123
```

## 常用命令

### 基础操作
```bash
# 初始化仓库
git init

# 添加文件
git add .

# 提交更改
git commit -m "feat: add new feature"

# 推送到远程
git push origin main
```

### 分支操作
```bash
# 创建分支
git checkout -b feature/new-feature

# 切换分支
git checkout main

# 合并分支
git merge feature/new-feature

# 删除分支
git branch -d feature/new-feature
```

### 撤销操作
```bash
# 撤销工作区更改
git checkout -- <file>

# 撤销暂存区更改
git reset HEAD <file>

# 撤销最后一次提交
git reset --soft HEAD~1
```

## 协作流程

### Pull Request
1. Fork 项目
2. 创建功能分支
3. 提交更改
4. 创建 Pull Request
5. 代码审查
6. 合并代码

### 代码审查
- 检查代码质量
- 确保测试通过
- 验证功能正确性
- 提供改进建议

## 总结

良好的 Git 使用习惯能提高团队协作效率，减少代码冲突和问题。
                ''',
                'excerpt': 'Git 是现代软件开发中不可或缺的工具，分享一些版本控制的最佳实践。',
                'layout_mode': 'three-image',
                'cover_image': 'https://picsum.photos/800/400?random=8',
                'category_id': categories[0].id,
                'author_id': admin_user.id,
                'status': 'published',
                'is_featured': False,
                'published_at': datetime.utcnow()
            },
            {
                'title': 'MySQL 数据库优化技巧',
                'slug': 'mysql-optimization-tips',
                'content': '''
# MySQL 数据库优化技巧

MySQL 是最流行的关系型数据库之一，掌握优化技巧很重要。

## 索引优化

### 创建合适的索引
```sql
-- 单列索引
CREATE INDEX idx_user_email ON users(email);

-- 复合索引
CREATE INDEX idx_user_name_email ON users(name, email);

-- 唯一索引
CREATE UNIQUE INDEX idx_user_username ON users(username);
```

### 索引使用原则
- 经常用于 WHERE 条件的列
- 经常用于 ORDER BY 的列
- 经常用于 JOIN 的列
- 避免在小表上创建索引

## 查询优化

### 使用 EXPLAIN 分析
```sql
EXPLAIN SELECT * FROM users WHERE email = 'user@example.com';
```

### 避免全表扫描
```sql
-- 不好的查询
SELECT * FROM users WHERE YEAR(created_at) = 2023;

-- 优化的查询
SELECT * FROM users WHERE created_at >= '2023-01-01' AND created_at < '2024-01-01';
```

### 使用 LIMIT
```sql
-- 限制结果数量
SELECT * FROM users ORDER BY created_at DESC LIMIT 10;
```

## 表结构优化

### 选择合适的数据类型
```sql
-- 使用 TINYINT 而不是 INT
status TINYINT(1) NOT NULL DEFAULT 0

-- 使用 VARCHAR 而不是 TEXT
description VARCHAR(255) NOT NULL
```

### 规范化设计
- 第一范式：原子性
- 第二范式：消除部分依赖
- 第三范式：消除传递依赖

## 配置优化

### 内存配置
```ini
# InnoDB 缓冲池大小
innodb_buffer_pool_size = 1G

# 查询缓存
query_cache_size = 64M
query_cache_type = 1
```

### 连接配置
```ini
# 最大连接数
max_connections = 200

# 连接超时
wait_timeout = 600
```

## 监控和诊断

### 慢查询日志
```ini
# 启用慢查询日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
```

### 性能监控
```sql
-- 查看当前连接
SHOW PROCESSLIST;

-- 查看表状态
SHOW TABLE STATUS;

-- 查看索引使用情况
SHOW INDEX FROM users;
```

## 总结

数据库优化是一个持续的过程，需要根据实际使用情况不断调整和优化。
                ''',
                'excerpt': 'MySQL 是最流行的关系型数据库之一，分享一些数据库优化的实用技巧。',
                'layout_mode': 'single-image',
                'cover_image': 'https://picsum.photos/800/400?random=9',
                'category_id': categories[0].id,
                'author_id': admin_user.id,
                'status': 'published',
                'is_featured': False,
                'published_at': datetime.utcnow()
            },
            {
                'title': 'React Hooks 深度解析',
                'slug': 'react-hooks-deep-dive',
                'content': '''
# React Hooks 深度解析

React Hooks 是 React 16.8 引入的新特性，让函数组件也能使用状态和生命周期。

## 基础 Hooks

### useState
```javascript
import { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);
  
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>
        Increment
      </button>
    </div>
  );
}
```

### useEffect
```javascript
import { useState, useEffect } from 'react';

function UserProfile({ userId }) {
  const [user, setUser] = useState(null);
  
  useEffect(() => {
    fetchUser(userId).then(setUser);
  }, [userId]); // 依赖数组
  
  return <div>{user?.name}</div>;
}
```

## 高级 Hooks

### useReducer
```javascript
import { useReducer } from 'react';

const initialState = { count: 0 };

function reducer(state, action) {
  switch (action.type) {
    case 'increment':
      return { count: state.count + 1 };
    case 'decrement':
      return { count: state.count - 1 };
    default:
      throw new Error();
  }
}

function Counter() {
  const [state, dispatch] = useReducer(reducer, initialState);
  
  return (
    <div>
      <p>Count: {state.count}</p>
      <button onClick={() => dispatch({type: 'increment'})}>
        +
      </button>
      <button onClick={() => dispatch({type: 'decrement'})}>
        -
      </button>
    </div>
  );
}
```

### useContext
```javascript
import { createContext, useContext } from 'react';

const ThemeContext = createContext();

function ThemeProvider({ children }) {
  const [theme, setTheme] = useState('light');
  
  return (
    <ThemeContext.Provider value={{ theme, setTheme }}>
      {children}
    </ThemeContext.Provider>
  );
}

function ThemedButton() {
  const { theme, setTheme } = useContext(ThemeContext);
  
  return (
    <button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>
      Toggle Theme
    </button>
  );
}
```

## 自定义 Hooks

### 数据获取 Hook
```javascript
import { useState, useEffect } from 'react';

function useFetch(url) {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);
  
  useEffect(() => {
    fetch(url)
      .then(res => res.json())
      .then(data => {
        setData(data);
        setLoading(false);
      })
      .catch(err => {
        setError(err);
        setLoading(false);
      });
  }, [url]);
  
  return { data, loading, error };
}

// 使用
function UserList() {
  const { data, loading, error } = useFetch('/api/users');
  
  if (loading) return <div>Loading...</div>;
  if (error) return <div>Error: {error.message}</div>;
  
  return (
    <ul>
      {data?.map(user => <li key={user.id}>{user.name}</li>)}
    </ul>
  );
}
```

## Hooks 规则

### 只在顶层调用
```javascript
// ❌ 错误：在条件语句中调用
if (condition) {
  const [state, setState] = useState(0);
}

// ✅ 正确：在顶层调用
const [state, setState] = useState(0);
if (condition) {
  // 使用 state
}
```

### 只在 React 函数中调用
- React 函数组件
- 自定义 Hooks

## 总结

Hooks 让 React 函数组件更加强大，是现代 React 开发的标准方式。
                ''',
                'excerpt': 'React Hooks 是 React 16.8 引入的新特性，让函数组件也能使用状态和生命周期。',
                'layout_mode': 'three-image',
                'cover_image': 'https://picsum.photos/800/400?random=10',
                'category_id': categories[0].id,
                'author_id': admin_user.id,
                'status': 'published',
                'is_featured': True,
                'published_at': datetime.utcnow()
            }
        ]
        
        for post_data in sample_posts:
            post = Post(**post_data)
            db.session.add(post)
        
        db.session.flush()
        
        # 为文章添加标签
        posts = Post.query.all()
        if posts:
            # 第一篇文章添加多个标签
            posts[0].tags.extend([tags[0], tags[1], tags[2]])  # Python, Flask, Web开发
            
            # 第二篇文章添加标签
            posts[1].tags.extend([tags[0], tags[1]])  # Python, Flask
            
            # 第三篇文章添加标签
            posts[2].tags.extend([tags[0], tags[5]])  # Python, 后端
            
            # 第四篇文章添加标签
            posts[3].tags.extend([tags[6], tags[7]])  # JavaScript, Vue.js
            
            # 第五篇文章添加标签
            posts[4].tags.extend([tags[10]])  # Docker
            
            # 第六篇文章添加标签
            posts[5].tags.extend([tags[6]])  # JavaScript
            
            # 第七篇文章添加标签
            posts[6].tags.extend([tags[16], tags[17]])  # 算法, 机器学习
            
            # 第八篇文章添加标签
            posts[7].tags.extend([tags[19]])  # 读书笔记
            
            # 第九篇文章添加标签
            posts[8].tags.extend([tags[18]])  # 生活感悟
            
            # 第十篇文章添加标签
            posts[9].tags.extend([tags[15]])  # Git
            
            # 第十一篇文章添加标签
            posts[10].tags.extend([tags[12]])  # MySQL
            
            # 第十二篇文章添加标签
            posts[11].tags.extend([tags[8]])  # React
        
        # 创建系统设置
        settings = [
            Setting(key='site_name', value='个人博客', description='网站名称', type='string'),
            Setting(key='site_description', value='一个基于Flask的个人博客系统', description='网站描述', type='string'),
            Setting(key='posts_per_page', value='10', description='每页文章数量', type='int'),
            Setting(key='allow_comments', value='true', description='是否允许评论', type='bool'),
            Setting(key='comment_moderation', value='true', description='评论是否需要审核', type='bool')
        ]
        
        for setting in settings:
            db.session.add(setting)
        
        db.session.flush()
        
        # 创建示例评论
        sample_comments = [
            {
                'post_id': posts[0].id,
                'author_name': '张三',
                'author_email': 'zhangsan@example.com',
                'author_website': 'https://zhangsan.com',
                'content': '写得很不错，学到了很多！',
                'status': 'approved',
                'ip_address': '127.0.0.1',
                'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
            },
            {
                'post_id': posts[0].id,
                'author_name': '李四',
                'author_email': 'lisi@example.com',
                'content': '感谢分享，期待更多精彩内容！',
                'status': 'approved',
                'ip_address': '127.0.0.1',
                'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
            },
            {
                'post_id': posts[1].id,
                'author_name': '王五',
                'author_email': 'wangwu@example.com',
                'content': 'Flask 确实是个很棒的框架，感谢作者的分享！',
                'status': 'approved',
                'ip_address': '127.0.0.1',
                'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
            },
            {
                'post_id': posts[2].id,
                'author_name': '赵六',
                'author_email': 'zhaoliu@example.com',
                'content': 'Python 技巧很实用，收藏了！',
                'status': 'approved',
                'ip_address': '127.0.0.1',
                'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
            },
            {
                'post_id': posts[3].id,
                'author_name': '孙七',
                'author_email': 'sunqi@example.com',
                'content': 'Vue 3 的新特性确实很强大！',
                'status': 'approved',
                'ip_address': '127.0.0.1',
                'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
            },
            {
                'post_id': posts[4].id,
                'author_name': '周八',
                'author_email': 'zhouba@example.com',
                'content': 'Docker 部署确实很方便，学习了！',
                'status': 'approved',
                'ip_address': '127.0.0.1',
                'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
            },
            {
                'post_id': posts[5].id,
                'author_name': '吴九',
                'author_email': 'wujiu@example.com',
                'content': 'JavaScript 异步编程确实需要好好掌握！',
                'status': 'approved',
                'ip_address': '127.0.0.1',
                'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
            },
            {
                'post_id': posts[6].id,
                'author_name': '郑十',
                'author_email': 'zhengshi@example.com',
                'content': '机器学习入门指南很详细，适合初学者！',
                'status': 'approved',
                'ip_address': '127.0.0.1',
                'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
            },
            {
                'post_id': posts[7].id,
                'author_name': '钱十一',
                'author_email': 'qianshiyi@example.com',
                'content': '《代码整洁之道》确实是经典，值得反复阅读！',
                'status': 'approved',
                'ip_address': '127.0.0.1',
                'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
            },
            {
                'post_id': posts[8].id,
                'author_name': '陈十二',
                'author_email': 'chenshier@example.com',
                'content': '保持学习热情很重要，感谢分享！',
                'status': 'approved',
                'ip_address': '127.0.0.1',
                'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
            }
        ]
        
        for comment_data in sample_comments:
            comment = Comment(**comment_data)
            db.session.add(comment)
        
        # 提交所有更改
        db.session.commit()
        print("示例数据创建完成")
        print(f"创建了 {len(categories)} 个分类")
        print(f"创建了 {len(tags)} 个标签")
        print(f"创建了 {len(sample_posts)} 篇文章")
        print(f"创建了 {len(sample_comments)} 条评论")
        print(f"创建了 {len(settings)} 个系统设置")
        print("管理员账户: admin / admin123")
        
        # 生成静态HTML文件
        print("\n🔄 开始生成静态HTML文件...")
        generate_static_html()

def generate_static_html():
    """生成静态HTML文件"""
    with app.app_context():
        try:
            import os
            import shutil
            from utils.html_generator import html_generator
            
            print("🔄 开始重新生成静态HTML文件...")
            
            # 删除旧的静态HTML文件
            static_html_dir = os.path.join(os.path.dirname(__file__), 'static', 'html')
            if os.path.exists(static_html_dir):
                print("🗑️ 删除旧的静态HTML文件...")
                try:
                    shutil.rmtree(static_html_dir)
                    print("✅ 旧文件删除完成")
                except Exception as e:
                    print(f"⚠️ 删除旧文件时出现警告: {str(e)}")
                    # 尝试删除单个文件
                    for root, dirs, files in os.walk(static_html_dir):
                        for file in files:
                            try:
                                os.remove(os.path.join(root, file))
                            except:
                                pass
                    print("✅ 强制清理完成")
            
            # 清理数据库中所有文章的html_path
            print("🧹 清理数据库中的html_path...")
            all_posts = Post.query.all()
            for post in all_posts:
                post.html_path = None
            db.session.commit()
            print("✅ 数据库清理完成")
            
            # 获取所有已发布的文章
            published_posts = Post.query.filter_by(status='published').all()
            
            print(f"📝 找到 {len(published_posts)} 篇已发布文章")
            
            success_count = 0
            for post in published_posts:
                try:
                    print(f"🔄 正在生成: {post.title}")
                    
                    # 生成静态HTML
                    html_path = html_generator.generate_post_html(post)
                    
                    # 更新数据库中的html_path
                    post.html_path = html_path
                    db.session.commit()
                    
                    print(f"✅ 生成成功: {post.title} -> {html_path}")
                    success_count += 1
                    
                except Exception as e:
                    print(f"❌ 生成文章 {post.title} 的静态HTML失败: {str(e)}")
                    continue
            
            print(f"🎉 静态HTML生成完成！成功生成 {success_count}/{len(published_posts)} 个文件")
            
        except Exception as e:
            print(f"❌ 静态HTML生成失败: {str(e)}")
            import traceback
            traceback.print_exc()


def seed_sample_comments():
    """为每篇已发布文章初始化一些评论与追评（仅当该文章暂无评论时）"""
    with app.app_context():
        try:
            from sqlalchemy import func
            # 仅处理已发布文章
            posts = Post.query.filter_by(status='published').all()
            if not posts:
                print("未找到已发布文章，跳过评论初始化")
                return
            seeded_posts = 0
            for post in posts:
                existing_count = Comment.query.filter_by(post_id=post.id).count()
                if existing_count > 0:
                    continue
                # 创建示例顶级评论
                c1 = Comment(
                    post_id=post.id,
                    author_name='Alice',
                    author_email='alice@example.com',
                    content='写得很好，受益匪浅！',
                    status='approved'
                )
                c2 = Comment(
                    post_id=post.id,
                    author_name='Bob',
                    author_email='bob@example.com',
                    content='请问代码部分能否再详细一点？',
                    status='approved'
                )
                db.session.add_all([c1, c2])
                db.session.flush()  # 获取c1、c2的id
                # 为第一条评论添加追评/回复
                r1 = Comment(
                    post_id=post.id,
                    author_name='作者',
                    author_email='author@example.com',
                    content='谢谢支持！后续我会补充更多细节~',
                    parent_id=c1.id,
                    status='approved'
                )
                r2 = Comment(
                    post_id=post.id,
                    author_name='Alice',
                    author_email='alice@example.com',
                    content='好的，已关注更新～',
                    parent_id=c1.id,
                    status='approved'
                )
                db.session.add_all([r1, r2])
                # 更新该文章评论数
                total_for_post = Comment.query.filter_by(post_id=post.id).count() + 2  # 预估加上本次新增
                # 更稳妥：重新统计
                total_for_post = Comment.query.filter_by(post_id=post.id).count()
                post.comment_count = total_for_post
                db.session.commit()
                seeded_posts += 1
                print(f"✅ 已为文章《{post.title}》初始化 {total_for_post} 条评论（含回复）")
            if seeded_posts == 0:
                print("所有已发布文章均已有评论，未进行初始化")
        except Exception as e:
            db.session.rollback()
            print(f"❌ 初始化评论失败: {str(e)}")
            import traceback
            traceback.print_exc()

if __name__ == '__main__':
    init_database()
